

<!DOCTYPE html>
<html class="writer-html5" lang="en" >
<head>
  <meta charset="utf-8" />
  <meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />

  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  
  <title>开发流程 &mdash; Ceph Documentation</title>
  

  
  <link rel="stylesheet" href="../../_static/ceph.css" type="text/css" />
  <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
  <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
  <link rel="stylesheet" href="../../_static/ceph.css" type="text/css" />
  <link rel="stylesheet" href="../../_static/graphviz.css" type="text/css" />
  <link rel="stylesheet" href="../../_static/css/custom.css" type="text/css" />

  
  

  
  

  

  
  <!--[if lt IE 9]>
    <script src="../../_static/js/html5shiv.min.js"></script>
  <![endif]-->
  
    
      <script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
        <script src="../../_static/jquery.js"></script>
        <script src="../../_static/_sphinx_javascript_frameworks_compat.js"></script>
        <script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js"></script>
        <script src="../../_static/doctools.js"></script>
        <script src="../../_static/sphinx_highlight.js"></script>
    
    <script type="text/javascript" src="../../_static/js/theme.js"></script>

    
    <link rel="index" title="Index" href="../../genindex/" />
    <link rel="search" title="Search" href="../../search/" />
    <link rel="next" title="为 Ceph 写作文档" href="../documenting/" />
    <link rel="prev" title="开发集群的部署" href="../dev_cluster_deployment/" /> 
</head>

<body class="wy-body-for-nav">

   
  <header class="top-bar">
    <div role="navigation" aria-label="Page navigation">
  <ul class="wy-breadcrumbs">
      <li><a href="../../" class="icon icon-home" aria-label="Home"></a></li>
          <li class="breadcrumb-item"><a href="../internals/">Ceph 内幕</a></li>
      <li class="breadcrumb-item active">开发流程</li>
      <li class="wy-breadcrumbs-aside">
            <a href="../../_sources/dev/development-workflow.rst.txt" rel="nofollow"> View page source</a>
      </li>
  </ul>
  <hr/>
</div>
  </header>
  <div class="wy-grid-for-nav">
    
    <nav data-toggle="wy-nav-shift" class="wy-nav-side">
      <div class="wy-side-scroll">
        <div class="wy-side-nav-search"  style="background: #eee" >
          

          
            <a href="../../" class="icon icon-home"> Ceph
          

          
          </a>

          

          
<div role="search">
  <form id="rtd-search-form" class="wy-form" action="../../search/" method="get">
    <input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
    <input type="hidden" name="check_keywords" value="yes" />
    <input type="hidden" name="area" value="default" />
  </form>
</div>

          
        </div>

        
        <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
          
            
            
              
            
            
              <ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../../start/">Ceph 简介</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../install/">安装 Ceph</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../cephadm/">Cephadm</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../rados/">Ceph 存储集群</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../cephfs/">Ceph 文件系统</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../rbd/">Ceph 块设备</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../radosgw/">Ceph 对象网关</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../mgr/">Ceph 管理器守护进程</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../mgr/dashboard/">Ceph 仪表盘</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../monitoring/">监控概览</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../api/">API 文档</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../architecture/">体系结构</a></li>
<li class="toctree-l1"><a class="reference internal" href="../developer_guide/">开发者指南</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="../internals/">Ceph 内幕</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="../balancer-design/">Ceph 如何均衡（读写、容量）</a></li>
<li class="toctree-l2"><a class="reference internal" href="../blkin/">Tracing Ceph With LTTng</a></li>
<li class="toctree-l2"><a class="reference internal" href="../blkin/#tracing-ceph-with-blkin">Tracing Ceph With Blkin</a></li>
<li class="toctree-l2"><a class="reference internal" href="../bluestore/">BlueStore Internals</a></li>
<li class="toctree-l2"><a class="reference internal" href="../ceph_krb_auth/">如何配置好 Ceph Kerberos 认证的详细文档</a></li>
<li class="toctree-l2"><a class="reference internal" href="../cephfs-mirroring/">CephFS Mirroring</a></li>
<li class="toctree-l2"><a class="reference internal" href="../cephfs-reclaim/">CephFS Reclaim Interface</a></li>
<li class="toctree-l2"><a class="reference internal" href="../cephfs-snapshots/">CephFS 快照</a></li>
<li class="toctree-l2"><a class="reference internal" href="../cephx/">Cephx</a></li>
<li class="toctree-l2"><a class="reference internal" href="../cephx_protocol/">Cephx 认证协议详细阐述</a></li>
<li class="toctree-l2"><a class="reference internal" href="../config/">配置管理系统</a></li>
<li class="toctree-l2"><a class="reference internal" href="../config-key/">config-key layout</a></li>
<li class="toctree-l2"><a class="reference internal" href="../context/">CephContext</a></li>
<li class="toctree-l2"><a class="reference internal" href="../continuous-integration/">Continuous Integration Architecture</a></li>
<li class="toctree-l2"><a class="reference internal" href="../corpus/">资料库结构</a></li>
<li class="toctree-l2"><a class="reference internal" href="../cpu-profiler/">Oprofile 的安装</a></li>
<li class="toctree-l2"><a class="reference internal" href="../crush-msr/">CRUSH MSR (Multi-step Retry)</a></li>
<li class="toctree-l2"><a class="reference internal" href="../cxx/">C++17 and libstdc++ ABI</a></li>
<li class="toctree-l2"><a class="reference internal" href="../deduplication/">去重</a></li>
<li class="toctree-l2"><a class="reference internal" href="../delayed-delete/">CephFS delayed deletion</a></li>
<li class="toctree-l2"><a class="reference internal" href="../dev_cluster_deployment/">开发集群的部署</a></li>
<li class="toctree-l2"><a class="reference internal" href="../dev_cluster_deployment/#id5">在同一机器上部署多套开发集群</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">开发流程</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#id2">发布周期</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id3">缺陷修正或功能的合并</a></li>
<li class="toctree-l3"><a class="reference internal" href="#resolving-bug-reports-and-implementing-features">Resolving bug reports and implementing features</a></li>
<li class="toctree-l3"><a class="reference internal" href="#running-and-interpreting-teuthology-integration-tests">Running and interpreting teuthology integration tests</a></li>
<li class="toctree-l3"><a class="reference internal" href="#preparing-a-new-release">Preparing a new release</a></li>
<li class="toctree-l3"><a class="reference internal" href="#cutting-a-new-stable-release">Cutting a new stable release</a></li>
<li class="toctree-l3"><a class="reference internal" href="#cutting-a-new-development-release">Cutting a new development release</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id4">发布修正版和移植</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../documenting/">为 Ceph 写作文档</a></li>
<li class="toctree-l2"><a class="reference internal" href="../dpdk/">Ceph messenger DPDKStack</a></li>
<li class="toctree-l2"><a class="reference internal" href="../encoding/">序列化（编码、解码）</a></li>
<li class="toctree-l2"><a class="reference internal" href="../erasure-coded-pool/">纠删码存储池</a></li>
<li class="toctree-l2"><a class="reference internal" href="../file-striping/">File striping</a></li>
<li class="toctree-l2"><a class="reference internal" href="../freebsd/">FreeBSD Implementation details</a></li>
<li class="toctree-l2"><a class="reference internal" href="../generatedocs/">Ceph 文档的构建</a></li>
<li class="toctree-l2"><a class="reference internal" href="../health-reports/">Health Reports</a></li>
<li class="toctree-l2"><a class="reference internal" href="../iana/">IANA 号</a></li>
<li class="toctree-l2"><a class="reference internal" href="../kclient/">Testing changes to the Linux Kernel CephFS driver</a></li>
<li class="toctree-l2"><a class="reference internal" href="../kclient/#step-one-build-the-kernel">Step One: build the kernel</a></li>
<li class="toctree-l2"><a class="reference internal" href="../kclient/#step-two-create-a-vm">Step Two: create a VM</a></li>
<li class="toctree-l2"><a class="reference internal" href="../kclient/#step-three-networking-the-vm">Step Three: Networking the VM</a></li>
<li class="toctree-l2"><a class="reference internal" href="../kubernetes/">Hacking on Ceph in Kubernetes with Rook</a></li>
<li class="toctree-l2"><a class="reference internal" href="../libcephfs_proxy/">Design of the libcephfs proxy</a></li>
<li class="toctree-l2"><a class="reference internal" href="../libs/">库体系结构</a></li>
<li class="toctree-l2"><a class="reference internal" href="../logging/">集群日志的用法</a></li>
<li class="toctree-l2"><a class="reference internal" href="../logs/">调试日志</a></li>
<li class="toctree-l2"><a class="reference internal" href="../macos/">在 MacOS 上构建</a></li>
<li class="toctree-l2"><a class="reference internal" href="../mempool_accounting/">What is a mempool?</a></li>
<li class="toctree-l2"><a class="reference internal" href="../mempool_accounting/#some-common-mempools-that-we-can-track">Some common mempools that we can track</a></li>
<li class="toctree-l2"><a class="reference internal" href="../messenger/">Messenger notes</a></li>
<li class="toctree-l2"><a class="reference internal" href="../mon-bootstrap/">Monitor bootstrap</a></li>
<li class="toctree-l2"><a class="reference internal" href="../mon-elections/">Monitor Elections</a></li>
<li class="toctree-l2"><a class="reference internal" href="../mon-on-disk-formats/">ON-DISK FORMAT</a></li>
<li class="toctree-l2"><a class="reference internal" href="../mon-osdmap-prune/">FULL OSDMAP VERSION PRUNING</a></li>
<li class="toctree-l2"><a class="reference internal" href="../msgr2/">msgr2 协议（ msgr2.0 和 msgr2.1 ）</a></li>
<li class="toctree-l2"><a class="reference internal" href="../network-encoding/">Network Encoding</a></li>
<li class="toctree-l2"><a class="reference internal" href="../network-protocol/">网络协议</a></li>
<li class="toctree-l2"><a class="reference internal" href="../object-store/">对象存储架构概述</a></li>
<li class="toctree-l2"><a class="reference internal" href="../osd-class-path/">OSD class path issues</a></li>
<li class="toctree-l2"><a class="reference internal" href="../peering/">互联</a></li>
<li class="toctree-l2"><a class="reference internal" href="../perf/">Using perf</a></li>
<li class="toctree-l2"><a class="reference internal" href="../perf_counters/">性能计数器</a></li>
<li class="toctree-l2"><a class="reference internal" href="../perf_histograms/">Perf histograms</a></li>
<li class="toctree-l2"><a class="reference internal" href="../placement-group/">PG （归置组）说明</a></li>
<li class="toctree-l2"><a class="reference internal" href="../quick_guide/">开发者指南（快速）</a></li>
<li class="toctree-l2"><a class="reference internal" href="../rados-client-protocol/">RADOS 客户端协议</a></li>
<li class="toctree-l2"><a class="reference internal" href="../rbd-diff/">RBD 增量备份</a></li>
<li class="toctree-l2"><a class="reference internal" href="../rbd-export/">RBD Export &amp; Import</a></li>
<li class="toctree-l2"><a class="reference internal" href="../rbd-layering/">RBD Layering</a></li>
<li class="toctree-l2"><a class="reference internal" href="../release-checklists/">Release checklists</a></li>
<li class="toctree-l2"><a class="reference internal" href="../release-process/">Ceph Release Process</a></li>
<li class="toctree-l2"><a class="reference internal" href="../seastore/">SeaStore</a></li>
<li class="toctree-l2"><a class="reference internal" href="../sepia/">Sepia 社区测试实验室</a></li>
<li class="toctree-l2"><a class="reference internal" href="../session_authentication/">Session Authentication for the Cephx Protocol</a></li>
<li class="toctree-l2"><a class="reference internal" href="../testing/">测试笔记</a></li>
<li class="toctree-l2"><a class="reference internal" href="../versions/">Public OSD Version</a></li>
<li class="toctree-l2"><a class="reference internal" href="../vstart-ganesha/">NFS CephFS-RGW Developer Guide</a></li>
<li class="toctree-l2"><a class="reference internal" href="../wireshark/">Wireshark Dissector</a></li>
<li class="toctree-l2"><a class="reference internal" href="../zoned-storage/">Zoned Storage Support</a></li>
<li class="toctree-l2"><a class="reference internal" href="../osd_internals/">OSD 开发者文档</a></li>
<li class="toctree-l2"><a class="reference internal" href="../mds_internals/">MDS 开发者文档</a></li>
<li class="toctree-l2"><a class="reference internal" href="../radosgw/">RADOS 网关开发者文档</a></li>
<li class="toctree-l2"><a class="reference internal" href="../ceph-volume/">ceph-volume 开发者文档</a></li>
<li class="toctree-l2"><a class="reference internal" href="../crimson/">Crimson developer documentation</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../governance/">项目管理</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../foundation/">Ceph 基金会</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../ceph-volume/">ceph-volume</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../releases/general/">Ceph 版本（总目录）</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../releases/">Ceph 版本（索引）</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../security/">Security</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../hardware-monitoring/">硬件监控</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../glossary/">Ceph 术语</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../jaegertracing/">Tracing</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../translation_cn/">中文版翻译资源</a></li>
</ul>

            
          
        </div>
        
      </div>
    </nav>

    <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">

      
      <nav class="wy-nav-top" aria-label="top navigation">
        
          <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
          <a href="../../">Ceph</a>
        
      </nav>


      <div class="wy-nav-content">
        
        <div class="rst-content">
        
          <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
           <div itemprop="articleBody">
            
<div id="dev-warning" class="admonition note">
  <p class="first admonition-title">Notice</p>
  <p class="last">This document is for a development version of Ceph.</p>
</div>
  <div id="docubetter" align="right" style="padding: 5px; font-weight: bold;">
    <a href="https://pad.ceph.com/p/Report_Documentation_Bugs">Report a Documentation Bug</a>
  </div>

  
  <section id="id1">
<h1>开发流程<a class="headerlink" href="#id1" title="Permalink to this heading"></a></h1>
<p>This page explains the workflows a developer is expected to follow to
implement the goals that are part of the Ceph release cycle. It does not
go into technical details and is designed to provide a high level view
instead. Each chapter is about a given goal such as <code class="docutils literal notranslate"><span class="pre">Merging</span> <span class="pre">bug</span>
<span class="pre">fixes</span> <span class="pre">or</span> <span class="pre">features</span></code> or <code class="docutils literal notranslate"><span class="pre">Publishing</span> <span class="pre">point</span> <span class="pre">releases</span> <span class="pre">and</span> <span class="pre">backporting</span></code>.</p>
<p>A key aspect of all workflows is that none of them blocks another. For
instance, a bug fix can be backported and merged to a stable branch
while the next point release is being published. For that specific
example to work, a branch should be created to avoid any
interference. In practice it is not necessary for Ceph because:</p>
<ul class="simple">
<li><p>there are few people involved</p></li>
<li><p>the frequency of backports is not too high</p></li>
<li><p>the reviewers, who know a release is being published, are unlikely
to merge anything that may cause issues</p></li>
</ul>
<p>This ad-hoc approach implies the workflows are changed on a regular
basis to adapt. For instance, <code class="docutils literal notranslate"><span class="pre">quality</span> <span class="pre">engineers</span></code> were not involved
in the workflow to publish <code class="docutils literal notranslate"><span class="pre">dumpling</span></code> point releases. The number of
commits being backported to <code class="docutils literal notranslate"><span class="pre">firefly</span></code> made it impractical for developers
tasked to write code or fix bugs to also run and verify the full suite
of integration tests. Inserting <code class="docutils literal notranslate"><span class="pre">quality</span> <span class="pre">engineers</span></code> makes it
possible for someone to participate in the workflow by analyzing test
results.</p>
<p>The workflows are not enforced when they impose an overhead that does
not make sense. For instance, if the release notes for a point release
were not written prior to checking all integration tests, they can be
commited to the stable branch and the result sent for publication
without going through another run of integration tests.</p>
<section id="id2">
<h2>发布周期<a class="headerlink" href="#id2" title="Permalink to this heading"></a></h2>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Ceph</span>              <span class="n">hammer</span>                             <span class="n">infernalis</span>
<span class="n">Developer</span>          <span class="n">CDS</span>                                  <span class="n">CDS</span>
<span class="n">Summit</span>              <span class="o">|</span>                                    <span class="o">|</span>
                    <span class="o">|</span>                                    <span class="o">|</span>
<span class="n">development</span>         <span class="o">|</span>                                    <span class="o">|</span>
<span class="n">release</span>             <span class="o">|</span>  <span class="n">v0</span><span class="mf">.88</span>  <span class="n">v0</span><span class="mf">.89</span>  <span class="n">v0</span><span class="mf">.90</span>   <span class="o">...</span>         <span class="o">|</span>  <span class="n">v9</span><span class="mf">.0.0</span>
               <span class="o">--</span><span class="n">v</span><span class="o">--^----^--</span><span class="n">v</span><span class="o">---^------^--</span><span class="n">v</span><span class="o">-</span>     <span class="o">---</span><span class="n">v</span><span class="o">----^----^---</span>  <span class="mi">2015</span>
                 <span class="o">|</span>          <span class="o">|</span>             <span class="o">|</span>         <span class="o">|</span>
<span class="n">stable</span>         <span class="n">giant</span>        <span class="o">|</span>             <span class="o">|</span>      <span class="n">hammer</span>
<span class="n">release</span>        <span class="n">v0</span><span class="mf">.87</span>        <span class="o">|</span>             <span class="o">|</span>      <span class="n">v0</span><span class="mf">.94</span>
                            <span class="o">|</span>             <span class="o">|</span>
<span class="n">point</span>                    <span class="n">firefly</span>       <span class="n">dumpling</span>
<span class="n">release</span>                  <span class="n">v0</span><span class="mf">.80.8</span>       <span class="n">v0</span><span class="mf">.67.12</span>
</pre></div>
</div>
<p>Four times a year, the development roadmap is discussed online during
the <a class="reference external" href="http://tracker.ceph.com/projects/ceph/wiki/Planning#Ceph-Developer-Summit">Ceph Developer Summit</a>. A
new stable release (hammer, infernalis, jewel …) is published at the same
frequency.  Every other release (firefly, hammer, jewel…) is a <a class="reference external" href="../../releases">Long Term
Stable (LTS)</a>.  See <a class="reference external" href="../../releases#understanding-the-release-cycle">Understanding the release cycle</a> for more information.</p>
</section>
<section id="id3">
<h2>缺陷修正或功能的合并<a class="headerlink" href="#id3" title="Permalink to this heading"></a></h2>
<p>The development branch is <code class="docutils literal notranslate"><span class="pre">master</span></code> and the workflow followed by all
developers can be summarized as follows:</p>
<ul class="simple">
<li><p>The developer prepares a series of commits</p></li>
<li><p>The developer submits the series of commits via a pull request</p></li>
<li><p>A reviewer is assigned the pull request</p></li>
<li><p>When the pull request looks good to the reviewer, it is merged into
an integration branch by the tester</p></li>
<li><p>After a successful run of integration tests, the pull request is
merged by the tester</p></li>
</ul>
<p>The <code class="docutils literal notranslate"><span class="pre">developer</span></code> is the author of a series of commits. The
<code class="docutils literal notranslate"><span class="pre">reviewer</span></code> is responsible for providing feedback to the developer on
a regular basis and the developer is invited to ping the reviewer if
nothing happened after a week. After the <code class="docutils literal notranslate"><span class="pre">reviewer</span></code> is satisfied
with the pull request, (s)he passes it to the <code class="docutils literal notranslate"><span class="pre">tester</span></code>. The
<code class="docutils literal notranslate"><span class="pre">tester</span></code> is responsible for running teuthology integration tests on
the pull request. If nothing happens within a month the <code class="docutils literal notranslate"><span class="pre">reviewer</span></code> is
invited to ping the <code class="docutils literal notranslate"><span class="pre">tester</span></code>.</p>
</section>
<section id="resolving-bug-reports-and-implementing-features">
<h2>Resolving bug reports and implementing features<a class="headerlink" href="#resolving-bug-reports-and-implementing-features" title="Permalink to this heading"></a></h2>
<p>All bug reports and feature requests are in the <a class="reference external" href="http://tracker.ceph.com">issue tracker</a> and the workflow can be summarized as
follows:</p>
<ul class="simple">
<li><p>The reporter creates the issue with priority <code class="docutils literal notranslate"><span class="pre">Normal</span></code></p></li>
<li><p>A developer may pick the issue right away</p></li>
<li><p>During a bi-weekly bug scrub, the team goes over all new issue and
assign them a priority</p></li>
<li><p>The bugs with higher priority are worked on first</p></li>
</ul>
<p>各小组（ <code class="docutils literal notranslate"><span class="pre">team</span></code> ）分别负责一个项目，由<a class="reference internal" href="../../governance/#governance"><span class="std std-ref">项目领导</span></a> 管理。</p>
<p>The <code class="docutils literal notranslate"><span class="pre">developer</span></code> assigned to an issue is responsible for it. The
status of an open issue can be:</p>
<ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">New</span></code>: it is unclear if the issue needs work.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">Verified</span></code>: the bug can be reproduced or showed up multiple times</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">In</span> <span class="pre">Progress</span></code>: the developer is working on it this week</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">Pending</span> <span class="pre">Backport</span></code>: the fix needs to be backported to the stable
releases listed in the backport field</p></li>
</ul>
<p>For each <code class="docutils literal notranslate"><span class="pre">Pending</span> <span class="pre">Backport</span></code> issue, there exists at least one issue
in the <code class="docutils literal notranslate"><span class="pre">Backport</span></code> tracker to record the work done to cherry pick the
necessary commits from the master branch to the target stable branch.
See <a class="reference external" href="http://tracker.ceph.com/projects/ceph-releases/wiki/HOWTO">the backporter manual</a> for more
information.</p>
</section>
<section id="running-and-interpreting-teuthology-integration-tests">
<h2>Running and interpreting teuthology integration tests<a class="headerlink" href="#running-and-interpreting-teuthology-integration-tests" title="Permalink to this heading"></a></h2>
<p>The <a class="reference internal" href="../sepia/"><span class="doc">Sepia 社区测试实验室</span></a> runs <a class="reference external" href="https://github.com/ceph/teuthology/">teuthology</a> integration tests <a class="reference external" href="http://tracker.ceph.com/projects/ceph-releases/wiki/HOWTO_monitor_the_automated_tests_AKA_nightlies#Automated-tests-AKA-nightlies">on a regular basis</a> and the
results are posted on <a class="reference external" href="http://pulpito.ceph.com/">pulpito</a> and the
<a class="reference external" href="https://ceph.com/irc/">ceph-qa mailing list</a>.</p>
<ul class="simple">
<li><p>The job failures are <a class="reference external" href="http://tracker.ceph.com/projects/ceph-releases/wiki/HOWTO_monitor_the_automated_tests_AKA_nightlies#List-of-suites-and-watchers">analyzed by quality engineers and developers</a></p></li>
<li><p>If the cause is environmental (e.g. network connectivity), an issue
is created in the <a class="reference external" href="http://tracker.ceph.com/projects/lab/issues/new">sepia lab project</a></p></li>
<li><p>If the bug is known, a pulpito URL to the failed job is added to the issue</p></li>
<li><p>If the bug is new, an issue is created</p></li>
</ul>
<p>The <code class="docutils literal notranslate"><span class="pre">quality</span> <span class="pre">engineer</span></code> is either a developer or a member of the QE
team. There is at least one integration test suite per project:</p>
<ul class="simple">
<li><p><a class="reference external" href="https://github.com/ceph/ceph/tree/master/qa/suites/rgw">rgw</a> suite</p></li>
<li><p><a class="reference external" href="https://github.com/ceph/ceph/tree/master/qa/suites/fs">CephFS</a> suite</p></li>
<li><p><a class="reference external" href="https://github.com/ceph/ceph/tree/master/qa/suites/rados">rados</a> suite</p></li>
<li><p><a class="reference external" href="https://github.com/ceph/ceph/tree/master/qa/suites/rbd">rbd</a> suite</p></li>
</ul>
<p>and many others such as</p>
<ul class="simple">
<li><p><a class="reference external" href="https://github.com/ceph/ceph/tree/master/qa/suites/upgrade">upgrade</a> suites</p></li>
<li><p><a class="reference external" href="https://github.com/ceph/ceph/tree/master/qa/suites/powercycle">power-cyle</a> suite</p></li>
<li><p>…</p></li>
</ul>
</section>
<section id="preparing-a-new-release">
<h2>Preparing a new release<a class="headerlink" href="#preparing-a-new-release" title="Permalink to this heading"></a></h2>
<p>A release is prepared in a dedicated branch, different from the
<code class="docutils literal notranslate"><span class="pre">master</span></code> branch.</p>
<ul class="simple">
<li><p>For a stable releases it is the branch matching the release code
name (dumpling, firefly, etc.)</p></li>
<li><p>For a development release it is the <code class="docutils literal notranslate"><span class="pre">next</span></code> branch</p></li>
</ul>
<p>The workflow expected of all developers to stabilize the release
candidate is the same as the normal development workflow with the
following differences:</p>
<ul class="simple">
<li><p>The pull requests must target the stable branch or next instead of
master</p></li>
<li><p>The reviewer rejects pull requests that are not bug fixes</p></li>
<li><p>The <code class="docutils literal notranslate"><span class="pre">Backport</span></code> issues matching a teuthology test failure and set
with priority <code class="docutils literal notranslate"><span class="pre">Urgent</span></code> must be fixed before the release</p></li>
</ul>
</section>
<section id="cutting-a-new-stable-release">
<h2>Cutting a new stable release<a class="headerlink" href="#cutting-a-new-stable-release" title="Permalink to this heading"></a></h2>
<p>A new stable release can be cut when:</p>
<ul class="simple">
<li><p>all <code class="docutils literal notranslate"><span class="pre">Backport</span></code> issues with priority <code class="docutils literal notranslate"><span class="pre">Urgent</span></code> are fixed</p></li>
<li><p>integration and upgrade tests run successfully</p></li>
</ul>
<p>Publishing a new stable release implies a risk of regression or
discovering new bugs during the upgrade, no matter how carefully it is
tested. The decision to cut a release must take this into account: it
may not be wise to publish a stable release that only fixes a few
minor bugs. For instance if only one commit has been backported to a
stable release that is not a LTS, it is better to wait until there are
more.</p>
<p>When a stable release is to be retired, it may be safer to
recommend an upgrade to the next LTS release instead of
proposing a new point release to fix a problem. For instance, the
<code class="docutils literal notranslate"><span class="pre">dumpling</span></code> v0.67.11 release has bugs related to backfilling which have
been fixed in <code class="docutils literal notranslate"><span class="pre">firefly</span></code> v0.80.x. A backport fixing these backfilling
bugs has been tested in the draft point release <code class="docutils literal notranslate"><span class="pre">dumpling</span></code> v0.67.12 but
they are large enough to introduce a risk of regression. As <code class="docutils literal notranslate"><span class="pre">dumpling</span></code>
is to be retired, users suffering from this bug can
upgrade to <code class="docutils literal notranslate"><span class="pre">firefly</span></code> to fix it. Unless users manifest themselves and ask
for <code class="docutils literal notranslate"><span class="pre">dumpling</span></code> v0.67.12, this draft release may never be published.</p>
<ul class="simple">
<li><p>The <code class="docutils literal notranslate"><span class="pre">Ceph</span> <span class="pre">lead</span></code> decides a new stable release must be published</p></li>
<li><p>The <code class="docutils literal notranslate"><span class="pre">release</span> <span class="pre">master</span></code> gets approval from all leads</p></li>
<li><p>The <code class="docutils literal notranslate"><span class="pre">release</span> <span class="pre">master</span></code> writes and commits the release notes</p></li>
<li><p>The <code class="docutils literal notranslate"><span class="pre">release</span> <span class="pre">master</span></code> informs the <code class="docutils literal notranslate"><span class="pre">quality</span> <span class="pre">engineer</span></code> that the
branch is ready for testing</p></li>
<li><p>The <code class="docutils literal notranslate"><span class="pre">quality</span> <span class="pre">engineer</span></code> runs additional integration tests</p></li>
<li><p>If the <code class="docutils literal notranslate"><span class="pre">quality</span> <span class="pre">engineer</span></code> discovers new bugs that require an
<code class="docutils literal notranslate"><span class="pre">Urgent</span> <span class="pre">Backport</span></code>, the release goes back to being prepared, it
was not ready after all</p></li>
<li><p>The <code class="docutils literal notranslate"><span class="pre">quality</span> <span class="pre">engineer</span></code> informs the <code class="docutils literal notranslate"><span class="pre">publisher</span></code> that the branch
is ready for release</p></li>
<li><p>The <code class="docutils literal notranslate"><span class="pre">publisher</span></code> <a class="reference external" href="../release-process">creates the packages and sets the release tag</a></p></li>
</ul>
<p>The person responsible for each role is:</p>
<ul class="simple">
<li><p>Sage Weil is the <code class="docutils literal notranslate"><span class="pre">Ceph</span> <span class="pre">lead</span></code></p></li>
<li><p>Sage Weil is the <code class="docutils literal notranslate"><span class="pre">release</span> <span class="pre">master</span></code> for major stable releases
(<code class="docutils literal notranslate"><span class="pre">firefly</span></code> 0.80, <code class="docutils literal notranslate"><span class="pre">hammer</span></code> 0.94 etc.)</p></li>
<li><p>Loic Dachary is the <code class="docutils literal notranslate"><span class="pre">release</span> <span class="pre">master</span></code> for stable point releases
(<code class="docutils literal notranslate"><span class="pre">firefly</span></code> 0.80.10, <code class="docutils literal notranslate"><span class="pre">hammer</span></code> 0.94.1 etc.)</p></li>
<li><p>Yuri Weinstein is the <code class="docutils literal notranslate"><span class="pre">quality</span> <span class="pre">engineer</span></code></p></li>
<li><p>Alfredo Deza is the <code class="docutils literal notranslate"><span class="pre">publisher</span></code></p></li>
</ul>
</section>
<section id="cutting-a-new-development-release">
<h2>Cutting a new development release<a class="headerlink" href="#cutting-a-new-development-release" title="Permalink to this heading"></a></h2>
<p>The publication workflow of a development release is the same as
preparing a new release and cutting it, with the following
differences:</p>
<ul class="simple">
<li><p>The <code class="docutils literal notranslate"><span class="pre">next</span></code> branch is reset to the tip of <code class="docutils literal notranslate"><span class="pre">master</span></code> after
publication</p></li>
<li><p>The <code class="docutils literal notranslate"><span class="pre">quality</span> <span class="pre">engineer</span></code> is not required to run additional tests,
the <code class="docutils literal notranslate"><span class="pre">release</span> <span class="pre">master</span></code> directly informs the <code class="docutils literal notranslate"><span class="pre">publisher</span></code> that the
release is ready to be published.</p></li>
</ul>
</section>
<section id="id4">
<h2>发布修正版和移植<a class="headerlink" href="#id4" title="Permalink to this heading"></a></h2>
<p>修正版的发布工作流和新版本的准备、修剪是相同的，不同的地方有：</p>
<ul class="simple">
<li><p>The <code class="docutils literal notranslate"><span class="pre">backport</span></code> field of each issue contains the code name of the
stable release</p></li>
<li><p>There is exactly one issue in the <code class="docutils literal notranslate"><span class="pre">Backport</span></code> tracker for each
stable release to which the issue is backported</p></li>
<li><p>All commits are cherry-picked with <code class="docutils literal notranslate"><span class="pre">git</span> <span class="pre">cherry-pick</span> <span class="pre">-x</span></code> to
reference the original commit</p></li>
</ul>
<p>详情见 <a class="reference external" href="http://tracker.ceph.com/projects/ceph-releases/wiki/HOWTO">移植手册</a> 。</p>
</section>
</section>



<div id="support-the-ceph-foundation" class="admonition note">
  <p class="first admonition-title">Brought to you by the Ceph Foundation</p>
  <p class="last">The Ceph Documentation is a community resource funded and hosted by the non-profit <a href="https://ceph.io/en/foundation/">Ceph Foundation</a>. If you would like to support this and our other efforts, please consider <a href="https://ceph.io/en/foundation/join/">joining now</a>.</p>
</div>


           </div>
           
          </div>
          <footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
        <a href="../dev_cluster_deployment/" class="btn btn-neutral float-left" title="开发集群的部署" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
        <a href="../documenting/" class="btn btn-neutral float-right" title="为 Ceph 写作文档" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
    </div>

  <hr/>

  <div role="contentinfo">
    <p>&#169; Copyright 2016, Ceph authors and contributors. Licensed under Creative Commons Attribution Share Alike 3.0 (CC-BY-SA-3.0).</p>
  </div>

   

</footer>
        </div>
      </div>

    </section>

  </div>
  

  <script type="text/javascript">
      jQuery(function () {
          SphinxRtdTheme.Navigation.enable(true);
      });
  </script>

  
  
    
   

</body>
</html>